Game xếp hình 2048

13.200 lượt xem;
1 //look for FIXME_VAR_TYPE
2 // Converted
from UnityScript to C# at http://www.M2H.nl/files/js_to_c.php - by Mike Hergaarden
3 // Do test the code! You usually need to change a few small bits.

4
5 using
UnityEngine;
6 using
System.Collections;
7 using
System.Collections.Generic;
8
9 [RequireComponent(
typeof(AudioSource))]
10 public
class GameControllerScript : MonoBehaviour {
11
12     
public Transform block;
13     
public Transform connector;
14     
public Transform[,,] blocks = new Transform[3,3,3];
15     
private Transform[,,,] connectors = new Transform[3,3,3,3];
16     
private int cubeRotationX; //how much the original cube has been rotated around X axis
17     
private int cubeRotationY; //how much the original cube has been rotated around Y axis
18     
private int cubeRotationZ; //how much the original cube has been rotated around Z axis
19     
private float moveStartTime = -1F;
20     
public float scale = 3F;
21     
public bool moving = false;
22     
public bool rotating = false;
23     
public float moveDuration = 0.10F;
24     
public float yOffset;
25     
private int score;
26     
public GUISkin currentGUISkin;
27     
public static bool performRestart = false;
28     
private bool initialized = false;
29     
public string gameView = "menu";
30     
public Camera mainCamera;
31     
private Vector2 scrollPosition;
32     
public Light gameLight;
33
34     
//sounds and audio source setup
35     
public AudioClip swipeSoundX;
36     
public AudioClip swipeSoundY;
37     
public AudioClip swipeSoundZ;
38     
public AudioClip collideSound;
39     
private AudioSource swipeAudioSource;
40     
private AudioSource collideAudioSource;
41
42     
//default light intensity
43     
public float lightIntensity = 0.4f;
44
45     
private OptionsScript options;
46     
private TimerScript timer;
47
48     
void Start (){
49
50         
int x;
51         
int y;
52         
int z;
53         
int axis;
54         yOffset =
1F;
55         Transform blockInstance;
56         BlockScript blockScript;
57         ConnectorScript connectorScript;
58         Transform connectorInstance;
59         TextMesh textMesh;
60
61         
this.gameView = "menu";
62         
this.options = this.gameObject.GetComponent ("OptionsScript") as OptionsScript;
63         
this.timer = this.gameObject.GetComponent ("TimerScript") as TimerScript;
64         
this.sizeGUI();
65         
66         
this.options.InitOptions();
67
68         
//setup audio sources
69         
70         AudioSource[] audioSources = GetComponents<AudioSource>();
71         
this.swipeAudioSource = audioSources[0];
72         
this.collideAudioSource = audioSources[1];
73         
this.collideAudioSource.clip = this.collideSound;
74
75         
//instantiate the blocks and connectors and position them
76         
for (x = 0; x <= 2; x++) {
77             
for (y = 0; y <= 2; y++) {
78                 
for (z = 0; z <= 2; z++) {
79                     
//instantiate the block
80                     blockInstance = Instantiate (block,
new Vector3(x * this.scale, y * this.scale + this.yOffset, z * this.scale), Quaternion.identity) as Transform;
81                     
this.blocks[x,y,z] = blockInstance;
82                     blockScript = blockInstance.gameObject.GetComponent(
"BlockScript") as BlockScript;
83                     blockScript.Initialize(x,y,z,
this);
84                 }
85             }
86         }
87
88         
// instantiate the connectors
89         
for (x = 0; x <= 2; x++) {
90             
for (y = 0; y <= 2; y++) {
91                 
for (z = 0; z <= 2; z++) {
92                     
//instantiate the x connector
93                     connectorInstance = Instantiate (connector)
as Transform;
94                     connectorScript = connectorInstance.gameObject.GetComponent(
"ConnectorScript") as ConnectorScript;
95                     connectorScript.Initialize(x,y,z,
"x", this);
96                     
this.connectors[x,y,z,0] = connectorInstance;
97
98                     
//instantiate the y connector
99                     connectorInstance = Instantiate (connector)
as Transform;
100                     connectorScript = connectorInstance.gameObject.GetComponent(
"ConnectorScript") as ConnectorScript;
101                     connectorScript.Initialize(x,y,z,
"y", this);
102                     
this.connectors[x,y,z,1] = connectorInstance;
103
104                     
//instantiate the z connector
105                     connectorInstance = Instantiate (connector)
as Transform;
106                     connectorScript = connectorInstance.gameObject.GetComponent(
"ConnectorScript") as ConnectorScript;
107                     connectorScript.Initialize(x,y,z,
"z", this);
108                     
this.connectors[x,y,z,2] = connectorInstance;
109                 }
110             }
111         }
112     
113         
//instantiate the move blocks
114         
if (PlayerPrefs.HasKey ("game_status")) {
115             
this.loadSavedGame();
116         }
117         
else {
118             
this.restart ();
119         }
120     }
121
122     
void setBlockNumber ( Transform blockInstance , int blockNumber ){
123         BlockScript blockScript;
124         blockScript = blockInstance.gameObject.GetComponent(
"BlockScript") as BlockScript;
125         blockScript.setBlockNumber(blockNumber);
126     }
127
128     
public int getBlockNumber ( Transform blockInstance ){
129         BlockScript blockScript;
130         blockScript = blockInstance.gameObject.GetComponent(
"BlockScript") as BlockScript;
131         
return blockScript.blockNumber;
132     }
133
134     
public int getBlockNumber(int x, int y, int z) {
135         
return this.getBlockNumber (this.blocks [x, y, z]);
136     }
137
138     
private int getInitialBlockNumber(int x, int y, int z) {
139
140         
if(this.options.board_type == "Solid Cube") {
141             
return -1;
142         }
143
144         
if(this.options.board_type == "Hollow Cube") { //hollow cube
145             
if(x == 1 && y == 1 && z == 1) {
146                 
return -2;
147             }
148             
else {
149                 
return -1;
150             }
151         }
152
153         
if(this.options.board_type == "Box Outline") { //box outline
154             
if(x == 1 && y == 1) {
155                 
return -2;
156             }
157             
if(x == 1 && z == 1) {
158                 
return -2;
159             }
160             
if(y ==1 && z == 1) {
161                 
return -2;
162             }
163             
else {
164                 
return -1;
165             }
166         }
167
168         
if(this.options.board_type == "Four Walls") {
169             
if(x == 1 && z == 1) {
170                 
return -2;
171             }
172             
else {
173                 
return -1;
174             }
175         }
176
177         
//default is no corners
178         
if(this.options.board_type == "No Corners/Center") {
179             
if(x==1 && y==1 && z==1) {
180                 
return -2;
181             }
182             
else if(x == 1 || y == 1 || z == 1) {
183                 
return -1;
184             }
185             
else {
186                 
return -2;
187             }
188         }
189
190         
//default is no corners
191         
//if(this.options.board_type == "No Corners") {
192             
if(x == 1 || y == 1 || z == 1) {
193                 
return -1;
194             }
195             
else {
196                 
return -2;
197             }
198         
//}
199
200
201
202     }
203
204     
private List<Transform> getEmptyBlocks (){
205         
int x;
206         
int y;
207         
int z;
208         
int count = 0;
209         List<Transform> emptyBlocks =
new List<Transform>();
210         
for (x = 0; x <= 2; x++) {
211             
for (y = 0; y <= 2; y++) {
212                 
for (z = 0; z <= 2; z++) {
213                     
if (this.getBlockNumber(this.blocks[x,y,z]) == -1) {
214                         emptyBlocks.Add(
this.blocks[x,y,z]);
215                         count = count +
1;
216                     }
217                 }
218             }
219         }
220         
return emptyBlocks;
221     }
222
223     
private bool fillRandomBlock (ref int x, ref int y, ref int z, ref int newNumber) {
224         List<Transform> emptyBlocks =
this.getEmptyBlocks();
225         
int emptyIndex;
226         BlockScript blockScript;
227
228         
if (emptyBlocks.Count > 0) {
229             emptyIndex = Random.Range(
0, emptyBlocks.Count);
230             
if(this.options.use_0) {
231                 newNumber = Random.Range(
0,3) * 2;
232             }
233             
else {
234                 newNumber = Random.Range(
1,3) * 2;
235             }
236             
this.setBlockNumber(emptyBlocks[emptyIndex], newNumber);
237             blockScript = emptyBlocks[emptyIndex].GetComponent(
"BlockScript") as BlockScript;
238             x = blockScript.x;
239             y = blockScript.y;
240             z = blockScript.z;
241             
return true;
242         }
243
244         
//no empty blocks to return
245         
return false;
246     }
247
248     
private void adjustConnectors() {
249         
int j, k, axis;
250         ConnectorScript connectorScript;
251         
bool show;
252 //
for (j = 0; j <= 2; j++) {
253 //
for (k = 0; k <= 2; k++) {
254 //
for (axis = 0; axis <= 2; axis++) {
255 // connectorScript =
this.connectors[j,k,axis].gameObject.GetComponent("ConnectorScript") as ConnectorScript;
256 // connectorScript.show =
true;
257 //
258 //
if (this.options.board_type == "Hollow Cube") {
259 //
if(j == 1 & k == 1) {
260 // connectorScript.show =
false;
261 // }
262 // }
263 //
264 //
if (this.options.board_type == "Box Outline") { //Box Outline
265 //
if(j == 1 || k == 1) {
266 // connectorScript.show =
false;
267 // }
268 // }
269 //
270 //
if (this.options.board_type == "Four Walls") {
271 // //
remove center connector on the x axis
272 //
if(axis == 0 && j == 1 & k == 1) {
273 // connectorScript.show =
false;
274 // }
275 // //
remove 3 center connectors on the y axis
276 //
if(axis == 1 && j == 1) {
277 // connectorScript.show =
false;
278 // }
279 // //
remove 3 center connectors on the z axis
280 //
if(axis == 2 && k == 1) {
281 // connectorScript.show =
false;
282 // }
283 // }
284 //
285 //
286 //
if (this.options.board_type == "No Corners") {
287 //
if(j != 1 && k != 1) {
288 // connectorScript.show =
false;
289 // }
290 // }
291 // }}}

292     }
293
294     
public bool doMove (string axis, int direction) {
295         
int loop1, loop2; //looping variables
296         
int x, y, z; //block location variables
297         
int numMoves = 0; //number of moves to make
298         
int scoreChange = 0;
299         
bool blockCollision = false;
300         
bool blockCollisionSound = false;
301         Transform blockA, blockB, blockC;
//variables for holding the three blocks in a row
302         IDictionary<
string, int> newNumbers = new Dictionary<string, int>(); //new numbers for blocks a,b & c to have
303         IDictionary<
string, int> shiftBy = new Dictionary<string, int>(); //distance for blocks a,b & c to shift
304         
int[,,] numbersAfterMove = new int[3,3,3];
305 ;
306         
if (PlayerPrefs.GetString ("game_status") != "playing") return false;
307         
if (this.gameView != "game") return false;
308
309         
//loop through each of the 9 rows to be calculated
310         
for(loop1 = 0; loop1 <=2; loop1++) {
311             
for(loop2 = 0; loop2 <=2; loop2++) {
312                 
if (axis == "x") {
313                     y = loop1;
314                     z = loop2;
315                     
if (direction == 1) {
316                         blockA=
this.blocks[0,y,z];
317                         blockB=
this.blocks[1,y,z];
318                         blockC=
this.blocks[2,y,z];
319                     }
320                     
else {
321                         blockA=
this.blocks[2,y,z];
322                         blockB=
this.blocks[1,y,z];
323                         blockC=
this.blocks[0,y,z];
324                     }
325                 }
326                 
else if (axis == "y") {
327                     x = loop1;
328                     z = loop2;
329                     
if (direction == 1) {
330                         blockA=
this.blocks[x,0,z];
331                         blockB=
this.blocks[x,1,z];
332                         blockC=
this.blocks[x,2,z];
333                     }
334                     
else {
335                         blockA=
this.blocks[x,2,z];
336                         blockB=
this.blocks[x,1,z];
337                         blockC=
this.blocks[x,0,z];
338                     }
339                 }
340                 
else {
341                     x = loop1;
342                     y = loop2;
343                     
if (direction == 1) {
344                         blockA=
this.blocks[x,y,0];
345                         blockB=
this.blocks[x,y,1];
346                         blockC=
this.blocks[x,y,2];
347                     }
348                     
else {
349                         blockA=
this.blocks[x,y,2];
350                         blockB=
this.blocks[x,y,1];
351                         blockC=
this.blocks[x,y,0];
352                     }
353                 }
354                 calculateRowChanges(
this.getBlockNumber(blockA), this.getBlockNumber(blockB), this.getBlockNumber(blockC), ref scoreChange, ref newNumbers, ref shiftBy, ref blockCollision);
355
356                 blockA.GetComponent<BlockScript>().move (axis, shiftBy[
"a"] * direction, this.scale, newNumbers["a"]);
357                 blockB.GetComponent<BlockScript>().move (axis, shiftBy[
"b"] * direction, this.scale, newNumbers["b"]);
358                 blockC.GetComponent<BlockScript>().move (axis, shiftBy[
"c"] * direction, this.scale, newNumbers["c"]);
359
360                 numMoves = numMoves + shiftBy[
"a"] + shiftBy["b"] + shiftBy["c"];
361                 
if (blockCollision) blockCollisionSound = true;
362
363                 
int newHighestBlock = 0;
364                 
if(newNumbers["a"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["a"];
365                 
if(newNumbers["b"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["b"];
366                 
if(newNumbers["c"] > PlayerPrefs.GetInt ("game_highest_block")) newHighestBlock = newNumbers["c"];
367
368                 
if (newHighestBlock > 0) {
369                     PlayerPrefs.SetInt (
"game_highest_block", newHighestBlock);
370                     
if (newHighestBlock == 2048) PlayerPrefs.SetString("game_status","game_won");
371                     PlayerPrefs.Save ();
372                     
this.timer.SetNextBlockTarget(newHighestBlock);
373                     
if (newHighestBlock > this.getHighestBlock()) this.SetHighestBlock(newHighestBlock);
374                 }
375
376
377
378
379                 PlayerPrefs.Save ();
380
381                 
//save the numbers after the move for redo
382                 numbersAfterMove[blockA.GetComponent<BlockScript>().x,
383                                  blockA.GetComponent<BlockScript>().y,
384                                  blockA.GetComponent<BlockScript>().z] = newNumbers[
"a"];
385                 
386                 numbersAfterMove[blockB.GetComponent<BlockScript>().x,
387                                  blockB.GetComponent<BlockScript>().y,
388                                  blockB.GetComponent<BlockScript>().z] = newNumbers[
"b"];
389                 
390                 numbersAfterMove[blockC.GetComponent<BlockScript>().x,
391                                  blockC.GetComponent<BlockScript>().y,
392                                  blockC.GetComponent<BlockScript>().z] = newNumbers[
"c"];
393             }
394         }
395
396         
if(blockCollisionSound && this.options.play_sounds) {
397             
this.collideAudioSource.PlayDelayed(this.moveDuration);
398         }
399
400         
if (numMoves > 0) {
401             
this.moveStartTime = Time.time;
402             
this.setScore (this.score + scoreChange);
403             
if(this.options.play_sounds) {
404                 
if (axis == "x") this.swipeAudioSource.PlayOneShot(swipeSoundX);
405                 
if (axis == "y") this.swipeAudioSource.PlayOneShot(swipeSoundY);
406                 
if (axis == "z") this.swipeAudioSource.PlayOneShot(swipeSoundZ);
407             }
408             
return true;
409         }
410         
else {
411             
return false;
412         }
413     }
414
415     
//Determine the possible successful combines between 3 blockNumbers (a,b,c) being pushed toward c
416     
void calculateRowChanges (int a, int b, int c, ref int scoreChange, ref IDictionary<string, int> newNumbers, ref IDictionary<string, int> shiftBy, ref bool blockCollision ) {
417         blockCollision =
false;
418
419         
//first check if we have any -2 values which signify that blocks cant merge along this connector
420         
if(a == -2 || b == -2 || c == -2) {
421             newNumbers[
"a"] = a;
422             newNumbers[
"b"] = b;
423             newNumbers[
"c"] = c;
424             shiftBy[
"a"] = 0;
425             shiftBy[
"b"] = 0;
426             shiftBy[
"c"] = 0;
427         }
428         
else {
429         
//figure out if any of the three merges occurred
430             shiftBy [
"c"] = 0;
431             
if (c > -1 && c == b) { //b and c merged
432                 scoreChange = scoreChange + c*
2;
433                 blockCollision =
true;
434                 newNumbers[
"c"] = c*2;
435                 newNumbers[
"b"] = a;
436                 newNumbers[
"a"] = -1;
437                 shiftBy[
"b"] = 1;
438                 
if(a > -1) {
439                     shiftBy[
"a"] = 1;
440                 }
441                 
else if (a == -1) {
442                     shiftBy[
"a"] = 0;
443                 }
444             }
445             
else if (b > -1 && a == b) { //a and b merged
446                 scoreChange = scoreChange + a*
2;
447                 blockCollision =
true;
448                 
if(c == -1) {
449                     newNumbers[
"c"] = b*2;
450                     newNumbers[
"b"] = -1;
451                     newNumbers[
"a"] = -1;
452                     shiftBy[
"b"] = 1;
453                     shiftBy[
"a"] = 2;
454                 }
455                 
else {
456                     newNumbers[
"c"] = c;
457                     newNumbers[
"b"] = b*2;
458                     newNumbers[
"a"] = -1;
459                     shiftBy[
"b"] = 0;
460                     shiftBy[
"a"] = 1;
461                 }
462             }
463             
else if (c > -1 && a == c && b == -1) { //a and c merged
464                 scoreChange = scoreChange + c*
2;
465                 blockCollision =
true;
466                 newNumbers[
"c"] = c*2;
467                 newNumbers[
"b"] = -1;
468                 newNumbers[
"a"] = -1;
469                 shiftBy[
"b"] = 0;
470                 shiftBy[
"a"] = 2;
471             }
//end of merges block
472             
else { //no merges occurred
473                 
if(c > -1) { //last column has number
474                     newNumbers[
"c"] = c;
475                     
if(b > -1) { //second column has number
476                         newNumbers[
"b"] = b;
477                         newNumbers[
"a"] = a;
478                         shiftBy[
"b"] = 0;
479                         shiftBy[
"a"] = 0;
480                     }
481                     
else if(b == -1) {//second column empty
482                         newNumbers[
"b"] = a;
483                         newNumbers[
"a"] = -1;
484                         shiftBy[
"b"] = 0;
485                         
if (a == -1) {
486                             shiftBy[
"a"] = 0;
487                         }
488                         
else {
489                             shiftBy[
"a"] = 1;
490                         }
491                     }
492                     
493                 }
//end of block for value in c column
494                 
else if (c == -1) { //first column empty
495                     
if(b > -1) { //second column has number
496                         newNumbers[
"c"] = b;
497                         newNumbers[
"b"] = a;
498                         newNumbers[
"a"] = -1;
499                         shiftBy[
"b"] = 1;
500                         
if(a > -1) {
501                             shiftBy[
"a"] = 1;
502                         }
503                         
else {
504                             shiftBy[
"a"] = 0;
505                         }
506                         
507                     }
508                     
else if(b == -1) { //second column empty and first column empty
509                         newNumbers[
"c"] = a;
510                         newNumbers[
"b"] = -1;
511                         newNumbers[
"a"] = -1;
512                         shiftBy[
"b"] = 0;
513                         
if (a == -1) {
514                             shiftBy[
"a"] = 0;
515                         }
516                         
else {
517                             shiftBy[
"a"] = 2;
518                         }
519                     }
520                 }
521             }
//end of no merges block
522         }
//end of check for -2;
523     }
524
525
526     
void Update (){
527         
int x =0, y=0, z=0, newNumber=0;
528         
if(GameControllerScript.performRestart) {
529             
this.restart ();
530             GameControllerScript.performRestart =
false;
531         }
532         
if(moveStartTime >= 0) {
533             
if(Time.time - this.moveStartTime > this.moveDuration + 0.05F) {
534                 
this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
535                 
this.saveHistory ();
536                 
this.moveStartTime = -1F;
537                 
if(this.getEmptyBlocks().Count == 0) {
538                     
if(this.CheckGameOver()) {
539                         PlayerPrefs.SetString (
"game_status", "game_over");
540                         PlayerPrefs.Save();
541                     }
542                 }
543             }
544         }
545         
else {
546             
bool moved;
547             
if (Input.GetKeyUp("right")) moved = this.doMove ("x", 1);
548             
if (Input.GetKeyUp("left")) moved = this.doMove ("x", -1);
549             
if (Input.GetKeyUp("up")) moved = this.doMove ("y", 1);
550             
if (Input.GetKeyUp("down")) moved = this.doMove ("y", -1);
551             
if (Input.GetKeyUp("a")) moved = this.doMove ("z", 1);
552             
if (Input.GetKeyUp("z")) moved = this.doMove ("z", -1);
553         }
554         
this.adjustConnectors();
555         
if (Input.GetKey(KeyCode.Escape))
556         {
557             Application.Quit();
558         }
559     }
560
561     
void FixedUpdate () {
562     }
563
564     
void setScore(int score) {
565         
this.score = score;
566         PlayerPrefs.SetInt (
"score", score);
567
568         
//handle setting high score
569         
if(this.score > this.GetHighScore()) {
570             
this.SetHighScore(this.score);
571         }
572     }
573
574     
public void restart() {
575         
int[,,] positions = new int[3, 3, 3];
576         
int x=0, y=0, z=0, newNumber=0;
577         
this.gameLight.intensity = this.lightIntensity;
578
579         
for (x = 0; x <= 2; x++) {
580             
for (y = 0; y <= 2; y++) {
581                 
for (z = 0; z <= 2; z++) {
582                     
this.setBlockNumber(this.blocks[x,y,z], this.getInitialBlockNumber(x,y,z));
583                     positions[x,y,z] = -
1;
584                 }
585             }
586         }
587
588         
this.adjustConnectors ();
589
590         PlayerPrefs.SetString (
"redo_moves2","");
591         PlayerPrefs.SetString (
"redo_moves1","");
592         PlayerPrefs.SetString (
"redo_moves0","");
593         PlayerPrefs.SetInt (
"redos", 2);
594         PlayerPrefs.SetString (
"game_status", "playing");
595         PlayerPrefs.SetInt (
"game_highest_block", 0);
596         PlayerPrefs.SetInt (
"cube_rotation_x", 0);
597         PlayerPrefs.SetInt (
"cube_rotation_y", 0);
598         PlayerPrefs.SetInt (
"cube_rotation_z", 0);
599         PlayerPrefs.Save ();
600
601         
this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
602         positions [x, y, z] = newNumber;
603         
this.fillRandomBlock(ref x, ref y, ref z, ref newNumber);
604         positions [x, y, z] = newNumber;
605         
this.saveHistory();
606
607         
this.setScore (0);
608         
609         TimerScript timerScript =
this.gameObject.GetComponent ("TimerScript") as TimerScript;
610         timerScript.ResetTimer();
611     }
612
613     
public int GetHighScore()
614     {
615         
string key = "highscore-" + options.GetOptionsKey();
616         
if (PlayerPrefs.HasKey (key)) {
617             
return PlayerPrefs.GetInt (key);
618         }
619         
else {
620             
this.SetHighScore(0);
621             
return 0;
622         }
623     }
624
625     
void SetHighScore(int myHighScore)
626     {
627         
string key = "highscore-" + options.GetOptionsKey();
628         PlayerPrefs.SetInt( key, myHighScore );
629         PlayerPrefs.Save();
630     }
631
632     
public int getHighestBlock()
633     {
634         
string key = "highestblock-" + options.GetOptionsKey();
635         
if (PlayerPrefs.HasKey (key)) {
636             
return PlayerPrefs.GetInt (key);
637         }
638         
else {
639             
this.SetHighestBlock(0);
640             
return 0;
641         }
642     }
643     
644     
void SetHighestBlock(int highestBlock)
645     {
646         
string key = "highestblock-" + options.GetOptionsKey();
647         PlayerPrefs.SetInt( key, highestBlock );
648         PlayerPrefs.Save();
649     }
650
651     
private bool CheckGameOver() {
652
653         
string[] axisList = new string[3] {"x", "y", "z"};
654         
int direction = 1;
655         
string axis = "x";
656         
int loop1, loop2, loopAxis; //looping variables
657         
int x, y, z; //block location variables
658         
int numMoves = 0; //number of moves to make
659         
int scoreChange = 0;
660         
bool blockCollision = false;
661         Transform blockA, blockB, blockC;
//variables for holding the three blocks in a row
662         IDictionary<
string, int> newNumbers = new Dictionary<string, int>(); //new numbers for blocks a,b & c to have
663         IDictionary<
string, int> shiftBy = new Dictionary<string, int>(); //distance for blocks a,b & c to shift
664         
665         
//loop through each of the 9 rows to be calculated
666         
for(loopAxis = 0; loopAxis < 3; loopAxis ++) {
667             axis = axisList[loopAxis];
668         
for(direction = -1; direction < 2; direction += 2) {
669         
for(loop1 = 0; loop1 <=2; loop1++) {
670         
for(loop2 = 0; loop2 <=2; loop2++) {
671             
if (axis == "x") {
672                 y = loop1;
673                 z = loop2;
674                 
if (direction == 1) {
675                     blockA=
this.blocks[0,y,z];
676                     blockB=
this.blocks[1,y,z];
677                     blockC=
this.blocks[2,y,z];
678                 }
679                 
else {
680                     blockA=
this.blocks[2,y,z];
681                     blockB=
this.blocks[1,y,z];
682                     blockC=
this.blocks[0,y,z];
683                 }
684             }
685             
else if (axis == "y") {
686                 x = loop1;
687                 z = loop2;
688                 
if (direction == 1) {
689                     blockA=
this.blocks[x,0,z];
690                     blockB=
this.blocks[x,1,z];
691                     blockC=
this.blocks[x,2,z];
692                 }
693                 
else {
694                     blockA=
this.blocks[x,2,z];
695                     blockB=
this.blocks[x,1,z];
696                     blockC=
this.blocks[x,0,z];
697                 }
698             }
699             
else {
700                 x = loop1;
701                 y = loop2;
702                 
if (direction == 1) {
703                     blockA=
this.blocks[x,y,0];
704                     blockB=
this.blocks[x,y,1];
705                     blockC=
this.blocks[x,y,2];
706                 }
707                 
else {
708                     blockA=
this.blocks[x,y,2];
709                     blockB=
this.blocks[x,y,1];
710                     blockC=
this.blocks[x,y,0];
711                 }
712             }
713             calculateRowChanges(
this.getBlockNumber(blockA), this.getBlockNumber(blockB), this.getBlockNumber(blockC), ref scoreChange, ref newNumbers, ref shiftBy, ref blockCollision);
714             
715             numMoves = numMoves + shiftBy[
"a"] + shiftBy["b"] + shiftBy["c"];
716         }
717         }
718         }
719         }
720         
if (numMoves > 0) {
721             
return false;
722         }
723         
else {
724             
return true;
725         }
726     }
727
728     
void OnGUI() {
729         
//GAME GUI
730         
if (this.gameView == "game") {
731             GUI.skin = currentGUISkin;
732             
this.gameLight.intensity = this.lightIntensity;
733             
this.mainCamera.transform.eulerAngles = new Vector3 (16F, 29.5F, 0);
734
735             
//create rotating buttons
736
737
738             
739             
if (PlayerPrefs.GetString ("game_status") == "game_over") {
740                 GUI.Label (
new Rect (0, Screen.height * 0.3f , Screen.width, Screen.height * 0.10F), "Game Over", "BigLabel");
741                 
this.gameLight.intensity = 0;
742             }
743             
if (PlayerPrefs.GetString ("game_status") == "game_won") {
744                 GUI.Label (
new Rect (0, Screen.height * 0.3f , Screen.width, Screen.height * 0.10F), "You Won!", "BigLabel");
745                 
if (GUI.Button(new Rect(Screen.width * .33f, Screen.height * 0.4F, Screen.width * 0.30F, Screen.height * 0.06F),"Continue")) {
746                     PlayerPrefs.SetString (
"game_status", "playing");
747                     PlayerPrefs.Save ();
748                 }
749                 
this.gameLight.intensity = 0;
750             }
751             
752             GUI.Label (
new Rect (0, 0, Screen.width, Screen.height * 0.06F), "Score: " + this.score.ToString (), "BigLabel");
753             
string highScoreText = "High Score/Block: " + this.GetHighScore ().ToString () + " / " + this.getHighestBlock ().ToString ();
754             GUI.Label (
new Rect (0, Screen.height * 0.06F, Screen.width, Screen.height / 10), highScoreText, "SmallLabel");
755             
756             
757             GUIStyle style = currentGUISkin.GetStyle (
"button");
758             
//style.fontSize = 14;
759             
760             
if (GUI.Button(new Rect(1, Screen.height * 0.12F, Screen.width * 0.30F, Screen.height * 0.06F),"Menu")) {
761                 
this.gameView = "menu";
762             }
763             
if (GUI.Button(new Rect(Screen.width * .33f, Screen.height * 0.12F, Screen.width * 0.33F, Screen.height * 0.06F),"Restart")) {
764                 
this.restart();
765             }
766             
if (GUI.Button(new Rect(Screen.width * .7f, Screen.height * 0.12F, Screen.width * .3f, Screen.height * 0.06F), "Undo (" + PlayerPrefs.GetInt ("redos").ToString () + ")")) {
767                 
this.undo();
768             }
769
770
771             
//Roation buttons
772
773             
774             
//GUI.Label(new Rect(Screen.width * .8f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButton");
775     
776             
//left button
777             
if (GUI.Button(new Rect(Screen.width * .73f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "\t", "RotateButtonLeft")) {
778                 
this.rotateBlocks(Vector3.up);
779             }
780             
//right button
781             
if (GUI.Button(new Rect(Screen.width * .87f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonRight")) {
782                 
this.rotateBlocks(Vector3.down);
783             }
784             
//up button
785             
if (GUI.Button(new Rect(Screen.width * .8f, Screen.height * 0.675F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonUp")) {
786                 
this.rotateBlocks(Vector3.right);
787             }
788             
//down button
789             
if (GUI.Button(new Rect(Screen.width * .8f, Screen.height * 0.765F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButtonDown")) {
790                 
this.rotateBlocks(Vector3.left);
791             }
792         }
793     }
794
795     
private void sizeGUI() {
796         
this.currentGUISkin.GetStyle ("Label").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
797         
this.currentGUISkin.GetStyle ("Button").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
798         
this.currentGUISkin.GetStyle ("Subheader").fontSize = Mathf.CeilToInt(Screen.height * 0.05F);
799         
this.currentGUISkin.GetStyle ("Toggle").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
800         
this.currentGUISkin.GetStyle ("ToggleLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
801         
this.currentGUISkin.GetStyle ("ToggleLabelWarning").fontSize = Mathf.CeilToInt(Screen.height * 0.04F);
802
803         
this.currentGUISkin.GetStyle ("SmallLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.03F);
804         
805         
this.currentGUISkin.GetStyle ("BigLabel").fontSize = Mathf.CeilToInt(Screen.height * 0.06F);
806
807         
this.currentGUISkin.GetStyle ("Toggle").padding.top = Mathf.CeilToInt(Screen.height * 0.04F);
808         
this.currentGUISkin.GetStyle ("Toggle").padding.left = Mathf.CeilToInt(Screen.height * 0.04F);
809     }
810
811     
private void saveHistory() {
812         
int x,y,z;
813         
string stringVal = "";
814
815         
//create comma separated list of values
816         
for (x = 0; x <= 2; x++) {
817             
for (y = 0; y <= 2; y++) {
818                 
for (z = 0; z <= 2; z++) {
819                     stringVal = stringVal + getBlockNumber(
this.blocks[x,y,z]).ToString() + ",";
820                 }
821             }
822         }
823         
//add score and highest block to end of array
824         stringVal = stringVal +
this.score.ToString() + "," + PlayerPrefs.GetInt ("game_highest_block").ToString();
825
826         PlayerPrefs.SetString (
"redo_moves2",PlayerPrefs.GetString ("redo_moves1"));
827         PlayerPrefs.SetString (
"redo_moves1",PlayerPrefs.GetString ("redo_moves0"));
828         PlayerPrefs.SetString (
"redo_moves0",stringVal);
829
830         PlayerPrefs.Save();
831     }
832
833     
private void undo() {
834         
string[] positions = new string[27];
835         
int myNum = 0;
836         
char[] separator = {','};
837
838         
if( PlayerPrefs.GetString ("game_status") != "game_over"
839            && PlayerPrefs.GetString (
"redo_moves1") != ""
840            && PlayerPrefs.GetInt (
"redos") > 0
841         ) {
842             positions = PlayerPrefs.GetString (
"redo_moves1").Split (separator);
843             
//loop through and set the block numbers for each block
844             
for (int x = 0; x <= 2; x++) {
845                 
for (int y = 0; y <= 2; y++) {
846                     
for (int z = 0; z <= 2; z++) {
847                         
int.TryParse(positions[9*x+3*y+z], out myNum);
848                         
this.setBlockNumber(this.blocks[x,y,z],myNum);
849                     }
850                 }
851             }
852
853             
//roll back the score
854             
int.TryParse (positions[27], out myNum);
855             
this.setScore (myNum);
856
857             
//roll back the game_highest_block
858             
int.TryParse (positions[28], out myNum);
859             PlayerPrefs.SetInt (
"game_highest_block", myNum);
860
861             
//move all the redo moves back
862             PlayerPrefs.SetString (
"redo_moves0",PlayerPrefs.GetString ("redo_moves1"));
863             PlayerPrefs.SetString (
"redo_moves1",PlayerPrefs.GetString ("redo_moves2"));
864             PlayerPrefs.SetString (
"redo_moves2","");
865             PlayerPrefs.SetInt (
"redos", PlayerPrefs.GetInt ("redos") - 1);
866         }
867     }
868
869     
private void rotateBlocks(Vector3 direction) {
870         Transform block;
871         BlockScript blockScript;
872         Transform connector;
873         ConnectorScript connectorScript;
874         
this.rotating = true;
875         
for (int x = 0; x <= 2; x++) {
876             
for (int y = 0; y <= 2; y++) {
877                 
for (int z = 0; z <= 2; z++) {
878                     block =
this.blocks[x,y,z];
879                     block.GetComponent<BlockScript>().rotateBlock(direction);
880
881                     
for(int axis = 0; axis <=2; axis++) {
882                         connector =
this.connectors[x,y,z,axis];
883                         connector.GetComponent<ConnectorScript>().rotateConnector (direction);
884                     }
885                 }
886             }
887         }
888     }
889
890     
private void loadSavedGame() {
891         
string[] positions = new string[27];
892         
int positionNum = 0;
893         
char[] separator = {','};
894         positions = PlayerPrefs.GetString (
"redo_moves0").Split (separator);
895
896         
for (int x = 0; x <= 2; x++) {
897             
for (int y = 0; y <= 2; y++) {
898                 
for (int z = 0; z <= 2; z++) {
899                     
int.TryParse(positions[9*x+3*y+z], out positionNum);
900                     
this.setBlockNumber(this.blocks[x,y,z],positionNum);
901                 }
902             }
903         }
904         
905         
906         
this.adjustConnectors ();
907         
this.setScore (PlayerPrefs.GetInt ("score"));
908
909     }
910 }


look for FIXME_VAR_TYPE

Converted from UnityScript to C# at http:www.M2H.nlfilesjs_to_c.php - by Mike Hergaarden

Do test the code! You usually need to change a few small bits.

private int cubeRotationX; how much the original cube has been rotated around X axis

private int cubeRotationY; how much the original cube has been rotated around Y axis

private int cubeRotationZ; how much the original cube has been rotated around Z axis

sounds and audio source setup

default light intensity

setup audio sources

instantiate the blocks and connectors and position them

instantiate the block

instantiate the connectors

instantiate the x connector

instantiate the y connector

instantiate the z connector

instantiate the move blocks

if(this.options.board_type == "Hollow Cube") { hollow cube

if(this.options.board_type == "Box Outline") { box outline

default is no corners

default is no corners

if(this.options.board_type == "No Corners") {

}

no empty blocks to return

for (j = 0; j <= 2; j++) {

for (k = 0; k <= 2; k++) {

for (axis = 0; axis <= 2; axis++) {

connectorScript = this.connectors[j,k,axis].gameObject.GetComponent("ConnectorScript") as ConnectorScript;

connectorScript.show = true;

if (this.options.board_type == "Hollow Cube") {

if(j == 1 & k == 1) {

connectorScript.show = false;

}

}

if (this.options.board_type == "Box Outline") { Box Outline

if(j == 1 || k == 1) {

connectorScript.show = false;

}

}

if (this.options.board_type == "Four Walls") {

remove center connector on the x axis

if(axis == 0 && j == 1 & k == 1) {

connectorScript.show = false;

}

remove 3 center connectors on the y axis

if(axis == 1 && j == 1) {

connectorScript.show = false;

}

remove 3 center connectors on the z axis

if(axis == 2 && k == 1) {

connectorScript.show = false;

}

}

if (this.options.board_type == "No Corners") {

if(j != 1 && k != 1) {

connectorScript.show = false;

}

}

}}}

int loop1, loop2; looping variables

int x, y, z; block location variables

int numMoves = 0; number of moves to make

Transform blockA, blockB, blockC; variables for holding the three blocks in a row

IDictionary newNumbers = new Dictionary(); new numbers for blocks a,b & c to have

IDictionary shiftBy = new Dictionary(); distance for blocks a,b & c to shift

loop through each of the 9 rows to be calculated

save the numbers after the move for redo

Determine the possible successful combines between 3 blockNumbers (a,b,c) being pushed toward c

first check if we have any -2 values which signify that blocks cant merge along this connector

figure out if any of the three merges occurred

if (c > -1 && c == b) { b and c merged

else if (b > -1 && a == b) { a and b merged

else if (c > -1 && a == c && b == -1) { a and c merged

} end of merges block

else { no merges occurred

if(c > -1) { last column has number

if(b > -1) { second column has number

else if(b == -1) {second column empty

} end of block for value in c column

else if (c == -1) { first column empty

if(b > -1) { second column has number

else if(b == -1) { second column empty and first column empty

} end of no merges block

} end of check for -2;

handle setting high score

int loop1, loop2, loopAxis; looping variables

int x, y, z; block location variables

int numMoves = 0; number of moves to make

Transform blockA, blockB, blockC; variables for holding the three blocks in a row

IDictionary newNumbers = new Dictionary(); new numbers for blocks a,b & c to have

IDictionary shiftBy = new Dictionary(); distance for blocks a,b & c to shift

loop through each of the 9 rows to be calculated

GAME GUI

create rotating buttons

style.fontSize = 14;

Roation buttons

GUI.Label(new Rect(Screen.width * .8f, Screen.height * 0.72F, Screen.width * .1f, Screen.height * 0.06F), "", "RotateButton");

left button

right button

up button

down button

create comma separated list of values

add score and highest block to end of array

loop through and set the block numbers for each block

roll back the score

roll back the game_highest_block

move all the redo moves back



Gõ tìm kiếm nhanh...